﻿function formatDate(value, row, index) {
    if (!value) return ''; // 如果值为空，则返回空字符串

    // 如果 value 包含 "time" 字段，则直接使用它作为时间戳
    if (value.time) {
        return moment(value.time).format('YYYY-MM-DD HH:mm:ss');
    }

    if (value.year !== undefined && value.month !== undefined && value.date !== undefined) {
        // 手动构造一个 Date 对象
        const date = new Date(
            value.year + 1900, // 修正年份
            value.month,       // 修正月份，月份从 0 开始
            value.date,
            value.hours || 0,
            value.minutes || 0,
            value.seconds || 0
        );
        return moment(date).format('YYYY-MM-DD HH:mm:ss');
    }

    // 如果 value 是一个标准时间对象或字符串
    return moment(value).format('YYYY-MM-DD HH:mm:ss');
}

/**
 * 通用导出 Excel 函数
 * @param {string} actionName 后端处理 Excel 导出的接口
 * @param {string} tableId 数据表格的 ID
 * @param {string} searchFormId 搜索表单的 ID
 * @param {string} selectField 需要选中的字段名 (默认为 id)
 * @param {string} selectIdsParamName 提交时的参数名，对应后端实体类中的字段名
 */
function excelDoc(actionName,
                  {tableId = 'datagrid', searchFormId = 'searchForm', selectField = 'id',
                      selectIdsParamName = 'selectedIds', params = {}} = {}) {
    // 函数体
    console.log(`actionName: ${actionName}`);
    console.log(`tableId: ${tableId}`);
    console.log(`searchFormId: ${searchFormId}`);
    console.log(`selectField: ${selectField}`);
    console.log(`selectIdsParamName: ${selectIdsParamName}`);

    // 获取查询后的所有数据（可能跨页）
    var datas = $('#' + `${tableId}`).datagrid('getData').rows;
    if (datas.length == 0) {
        $.messager.alert('信息提示', '暂无数据!!!', 'info');
        return;
    }

    // 获取选中的行
    var rows = $('#' + `${tableId}`).datagrid('getSelections');
    var ids = [];

    // 判断是否有选中项
    if (rows.length === 0) {
        // 如果没有选中条目，默认导出所有数据
        var ids = [];// 如果未选中任何数据，清空 selectIds 以便后端导出全部数据
    } else {
        // 如果选中条目，导出选中的数据
        var ids = rows.map(function(row) {
            return row[`${selectField}`]; // 动态获取指定字段的值
        });
    }
    console.log("ids===========>", ids);

    // 创建一个表单，提交到后端进行文件下载
    var form = $('<form method="POST"></form>');
    form.attr("action", `${actionName}`);

    // 将每个 ID 都作为一个独立的隐藏字段添加到表单中
    // 动态生成隐藏字段并附加到表单
    ids.forEach(function(id) {
        // 动态构造隐藏字段的 name 属性
        $('<input type="hidden" name="' + `${selectIdsParamName}` + '" value="' + id + '">').appendTo(form);
    });

    // 处理表单中的输入
    var formData = $('#' + `${searchFormId}`).serializeArray();
    // 遍历表单字段并添加到动态表单
    $.each(formData, function (i, field) {
        // 判断字段值是否为空，避免添加空值字段
        var value = field.value.trim();
        if (value) {
            // 创建隐藏字段并添加到表单
            $('<input>', {
                type: 'hidden',
                name: field.name,
                value: value
            }).appendTo(form);
        }
    });

    // 将表单添加到 body，然后提交表单
    form.appendTo('body');
    form.submit();
    // 提交后移除表单
    form.remove();
}

//在表单提交前，手动遍历表单字段，移除值为空的字段。
function removeEmptyFields(form) {
    $(form).find(':input').each(function() {
        if (!$(this).val()) {
            $(this).removeAttr('name');
        }
    });
}

// 格式化器：将 Date 对象转为 'yyyy-MM-dd HH:mm:ss' 格式的字符串
function formatter(date) {
    if (!date) return '';
    var y = date.getFullYear();
    var m = date.getMonth() + 1;
    var d = date.getDate();
    var h = date.getHours();
    var minute = date.getMinutes();
    var second = date.getSeconds();
    return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d) + ' ' +
        (h < 10 ? '0' + h : h) + ':' + (minute < 10 ? '0' + minute : minute) + ':' +
        (second < 10 ? '0' + second : second);
}

// 解析器，将字符串转为 Date 对象
function parser(s) {
    if (!s) return new Date();

    if (typeof s === 'number') {
        // 如果是时间戳
        return new Date(s);
    }
    if (s instanceof Date) {
        // 如果是 Date 对象
        return s;
    }

    // 处理字符串格式 yyyy-MM-dd HH:mm:ss
    var parts = s.split(' ');
    var dateParts = parts[0].split('-');
    var timeParts = parts[1] ? parts[1].split(':') : [0, 0, 0];
    var y = parseInt(dateParts[0], 10);
    var m = parseInt(dateParts[1], 10) - 1;
    var d = parseInt(dateParts[2], 10);
    var h = parseInt(timeParts[0], 10);
    var min = parseInt(timeParts[1], 10);
    var sec = parseInt(timeParts[2], 10);
    if (!isNaN(y) && !isNaN(m) && !isNaN(d) && !isNaN(h) && !isNaN(min) && !isNaN(sec)) {
        return new Date(y, m, d, h, min, sec);
    } else {
        return new Date();
    }
}

// 扩展 datagrid 支持 emptyMsg 属性
$.extend($.fn.datagrid.methods, {
    emptyMsg: function (jq) {
        return jq.each(function () {
            const opts = $(this).datagrid('options');
            const panel = $(this).datagrid('getPanel');
            const data = $(this).datagrid('getData');
            const body = panel.find('div.datagrid-view');

            // 判断数据是否为空
            if (data.total === 0) {
                const msg = opts.emptyMsg || '暂无数据';
                const d = $('<div style="text-align:center; padding:10px; color:gray;">' + msg + '</div>');
                body.find('div.datagrid-view2').empty().append(d);
            }
        });
    }
});


/**
 * 格式化图片字段
 * @param {string} value - 图片的 URL 地址
 * @param {number} width - 图片宽度
 * @param {number} height - 图片高度
 * @param {string} altText - 图片的替代文本
 * @returns {string} HTML 字符串，用于展示图片
 */
function formatImage(value, row, index, width = 100, height = 100, altText = '图片') {
    // 如果是 footer 数据，不做处理，直接返回原始值
    if (row && row.isFooter) {
        return value;
    }
    // 普通行图片数据的格式化逻辑
    if (value) {
        return `<a href="${value}" target="_blank">
                    <img src="${value}" alt=${altText} style="width:${width}px;height:${height}px;" />
                </a>`;
    }
    return '';
}

//封装通用 formatter 函数
function generalFormatter(value, row, index, mapping, defaultValue = '未知') {
    // 如果是 footer 数据，不做处理，直接返回原始值
    if (row && row.isFooter) {
        return value;
    }
    // 普通行数据的格式化逻辑
    return mapping[value] || defaultValue;
}


function initializeDateRangePickers(options = {}) {
    const {
        selector = '.daterange', // 选择器，默认为 '.daterange'
        editable = false,        // 是否允许手动输入
        required = false,        // 是否必填
        locale: customLocale = {}, // 用户传入的 locale 配置，赋给customLocale, 默认为空对象
        autoUpdateInput = false, // 不自动更新输入框
        opens = 'right',         // 日历弹出方向
        drops = 'down',          // 日历弹出位置
        singleDatePicker = false,// 是否单日期选择
        showDropdowns = false,   // 是否显示年份和月份下拉框
        alwaysShowCalendars = true // 始终显示日历
    } = options;

    // 默认的 locale 配置
    const defaultLocale = {
        format: 'YYYY-MM-DD',
        applyLabel: '确定',
        cancelLabel: '取消',
        daysOfWeek: ['日', '一', '二', '三', '四', '五', '六'],
        monthNames: [
            '一月', '二月', '三月', '四月', '五月', '六月',
            '七月', '八月', '九月', '十月', '十一月', '十二月'
        ],
        firstDay: 1
    };

    // 合并默认 locale 和用户定制化的 locale
    const locale = { ...defaultLocale, ...customLocale };

    // 遍历所有匹配的输入框
    $(selector).each(function () {
        const $input = $(this);

        // 初始化 EasyUI Datebox
        $input.datebox({
            editable, // 是否允许手动输入
            required, // 是否必填
            formatter: function (date) {
                if (!date) return '';
                // 获取存储的结束日期
                const endDate = $input.data('endDate') || '';
                return moment(date).format(locale.format) + (endDate ? ' - ' + endDate : '');
            },
            parser: function (s) {
                if (!s) return null;
                // 仅解析起始日期
                const parts = s.split(' - ');
                return moment(parts[0], locale.format).toDate();
            },
            onShowPanel: function () {
                // 隐藏 EasyUI 自带的面板
                $input.datebox('hidePanel');

                const $textbox = $input.datebox('textbox');

                // 初始化 Daterangepicker
                if (!$textbox.data('daterangepicker')) {
                    $textbox.daterangepicker({
                        locale,
                        autoUpdateInput,
                        opens,
                        drops,
                        singleDatePicker,
                        showDropdowns,
                        alwaysShowCalendars
                    }, function (start, end) {
                        // 更新 Datebox 的值
                        const startDate = start.format(locale.format);
                        const endDate = end.format(locale.format);

                        // 存储结束日期
                        $input.data('endDate', endDate);
                        $input.datebox('setValue', startDate + ' - ' + endDate);
                    });

                    // 处理取消按钮事件
                    $textbox.on('cancel.daterangepicker', function () {
                        $input.datebox('clear');
                        $input.data('endDate', '');
                    });
                }
            }
        });
    });
}


// 扩展 EasyUI 表单序列化为 JSON 对象
//serializeObject 方法是对 jQuery 的扩展，而不是 EasyUI form 的扩展，因此不能通过 $('#fm').form('serializeObject') 调用，
// 而应直接调用 $('#fm').serializeObject()。
$.fn.serializeObject = function(){
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};


// 扩展 EasyUI 表单序列化为 JSON 对象
// 如果希望通过 EasyUI 的 form 方法来调用 serializeObject，你需要手动扩展 EasyUI 的 form.methods。
$.extend($.fn.form.methods, {
    serializeObject: function(jq){
        var o = {};
        var a = jq.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    }
});



